#ifndef __PAGELIBPREPROCESSOR_H__
#define __PAGELIBPREPROCESSOR_H__

#include <vector>
#include <map>

using std::vector;
using std::map;
using std::string;
using std::pair;

class SplitTool;
class WebPage;
class Configuration;
class PageLib;

class PageLibPreprocessor
{
public:
    //psplit no need!
    PageLibPreprocessor(Configuration *pconf, SplitTool *psplitTool, PageLib &pb);
    ~PageLibPreprocessor();

    void doProcess();

    //test
    // vector<WebPage> &getLib(){
    //     return _pageLib;
    // }
    // map<string, vector<pair<int,double>>> &getInvert() {
    //     return _invertIndexTable;
    // }
    // map<int, pair<int, int>> &getOffset() {
    //     return _offsetLib;
    // }

private:
    void readInfoFromFile();
    void cutRedundantPage();
    void buildInvertIndexTable();
    void storeOnDisk();


private:
    SplitTool *_psplitPool;
    Configuration *_pconf;
    vector<WebPage> _pageLib;
    map<int, pair<int, int>> _offsetLib;
    map<string,vector<pair<int, double>>> _invertIndexTable;
};

//-------------------------------------------------------------------



// template <typename T, typename Compare>
// void heapAdjust(size_t i,size_t n,Compare &com, vector<T>& _vec) {
//     while (i < n) {
//         int maxIdx = i;
//         int leftChild = 2 * i + 1;
//         int rightChild = 2 * i + 2;
//         if (leftChild < n && com(_vec[maxIdx],_vec[leftChild])) {
//             maxIdx = leftChild;
//         }
//         if (rightChild < n && com(_vec[maxIdx], _vec[rightChild])) {
//             maxIdx = rightChild;
//         }
//         if (maxIdx == i) {
//             break;
//         }
//         T temp = _vec[i];
//         _vec[i] = _vec[maxIdx];
//         _vec[maxIdx] = temp;
//         //swap(_vec, i, maxIdx);
//         i = maxIdx;
//     }
// }


// template <typename T, typename Compare>
// void heapsort(Compare &com, vector<T>& _vec) {
//     for (int i = (_vec.size()-2)/2; i >= 0; i--) {
//         heapAdjust(i, _vec.size(), com, _vec);
//     }
//     int length = _vec.size();
//     while (length > 1) {
//         T temp = _vec[0];
//         _vec[0] = _vec[length - 1];
//         _vec[length - 1] = temp;
//         //swap(_vec, 0, length - 1);
//         length--;
//         heapAdjust(0, length, com, _vec);
//     }
// }

#endif
